home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSIPPCTest.c < prev    next >
C/C++ Source or Header  |  1993-11-18  |  4KB  |  168 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIPPCTest        -    Test PPC sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    02Aug92                                Language    :    MPW C
  6.                 12Aug92    MN    
  7.                 08Sep92    MN    Factor out common socket routines
  8.                 14Oct92    MN    Fix NBP type, usage messages
  9.                 20Jun93    MN    New sa_constr
  10. Last        :    20Jun93
  11. *********************************************************************/
  12.  
  13. #include <GUSI.h>
  14. #include <GUSITest.h>
  15. #include <stdio.h>
  16. #include <fcntl.h>
  17. #include <stdlib.h>
  18. #include <errno.h>
  19. #include <string.h>
  20.  
  21. #include <Events.h>
  22. #include <TextUtils.h>
  23.  
  24. extern int GUSIDefaultSpin(spin_msg, long);
  25.  
  26. sa_constr_ppc    Constr    =    {
  27.     PPC_CON_NEWSTYLE+PPC_CON_MATCH_TYPE,
  28.     "\p",
  29.     {
  30.         smRoman,
  31.         "\p",
  32.         ppcByString,
  33.         "\pGUSIPPCTest"
  34.     }
  35. };
  36.  
  37. void Socket(char, char, const char *)
  38. {
  39.     sock    =    socket(AF_PPC, SOCK_STREAM, 0);
  40.     
  41.     if (sock == -1)    {
  42.         printf("# socket() returned error %s\n", Explain());
  43.         Where();
  44.     }
  45. }
  46.  
  47. void Bind(char ch1, char ch2, const char * cmd)
  48. {
  49.     struct sockaddr_ppc    addr;
  50.  
  51.     if (sock == -1)    {
  52.         printf("# socket is not open\n");
  53.         Where();
  54.         
  55.         return;
  56.     }
  57.  
  58.     addr.family    =    AF_PPC;
  59.     addr.port.nameScript                        =    smRoman;
  60.     addr.port.portKindSelector                =    ppcByString;
  61.     addr.location.locationKindSelector    =    ppcNBPTypeLocation;
  62.     
  63.     if (sscanf(cmd, "%P %P", addr.port.name, &addr.location.u.nbpType) != 2) {
  64.         Usage(ch1, ch2);
  65.             
  66.         return;
  67.     }
  68.             
  69.     strcpy((char *) &addr.port.u.portTypeStr, (char *) "\pGUSIPPCTest");
  70.  
  71.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  72.         printf("bind() returned error %s\n", Explain());
  73.         Where();
  74.     }
  75. }
  76.  
  77. void Accept(char, char, const char *)
  78. {
  79.     int                        len;
  80.     struct sockaddr_ppc    addr;
  81.  
  82.     if (sock == -1)    {
  83.         printf("# socket is not open\n");
  84.         Where();
  85.         
  86.         return;
  87.     }
  88.     if (accsock != -1)    {
  89.         printf("# can't accept more than one connection\n");
  90.         Where();
  91.         
  92.         return;
  93.     }
  94.  
  95.     len    =    sizeof(struct sockaddr_ppc);
  96.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  97.     
  98.     if (sock < 0)    {
  99.         printf("# accept() returned error %s\n", Explain());
  100.         sock        =    accsock;
  101.         accsock    =    -1;
  102.     } else {
  103.         printf(
  104.             "# accepted connection from %P[%P]", 
  105.             addr.port.name, 
  106.             addr.port.u.portTypeStr);
  107.         
  108.         switch (addr.location.locationKindSelector) {
  109.         case ppcNBPLocation:
  110.             printf(
  111.                 "@%P:%P:%P\n", 
  112.                 addr.location.u.nbpEntity.objStr, 
  113.                 addr.location.u.nbpEntity.typeStr, 
  114.                 addr.location.u.nbpEntity.zoneStr);
  115.             break;
  116.         case ppcNBPTypeLocation:
  117.             printf("@%P\n", addr.location.u.nbpType);
  118.             break;
  119.         default:
  120.             printf("\n");
  121.             break;
  122.         }
  123.     }
  124.     
  125.     Where();
  126. }
  127.     
  128. void Connect(char, char, const char * cmd)
  129. {
  130.     int                        len;
  131.     struct sockaddr_ppc    addr;
  132.  
  133.     if (sock == -1)    {
  134.         printf("# socket is not open\n");
  135.         Where();
  136.         
  137.         return;
  138.     }
  139.     
  140.     len = sizeof(struct sockaddr_ppc);
  141.         
  142.     if (choose(AF_PPC, 0, "Yeah ?", &Constr, 0, &addr, &len))    {
  143.         printf("# choose() returned error %s\n", Explain());
  144.         Where();
  145.             
  146.         return;
  147.     }
  148.     if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  149.         printf("# connect() returned error %s\n", Explain());
  150.         Where();
  151.     }
  152. }    
  153.  
  154. main(int argc, char ** argv)
  155. {
  156.     printf("GUSIPPCTest        MN 20Jun93\n\n");
  157.  
  158.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  159.     COMMAND('b', 'd', Bind,      "Name Type",     "Bind to address");
  160.     COMMAND('c', 'o', Connect, "",                 "Connect to address");
  161.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  162.     
  163.     AddSocketCommands();
  164.     
  165.     GUSISetEvents(GUSISIOWEvents);
  166.     RunTest(argc, argv);
  167.     CleanupSockets();
  168. }